#include <stdio.h>
#include <stdlib.h>

typedef int CoefSet; /* 定义多项式系数为int型 */

typedef struct PolyNode *Position; /* 指针即结点位置 */
struct PolyNode {
    CoefSet coef; /* 系数 */
    int expon; /* 指数 */
    Position next; /* 线性表中下一个元素的位置 */
};
typedef Position Polynomial;

Position Attach(CoefSet coef, int expon, Position rear);
Polynomial ReadPoly();
void PrintPoly(Polynomial p);

Polynomial PolyDifferentiation(Polynomial p) {
    /* 求多项式p的导函数，返回结果多项式 */
    /* 原多项式在求导后即被导函数取代    */
    Polynomial p1, p2;

    p2 = p;
    p1 = NULL; /* p1总指向p2的前一项 */
    while (p2 != NULL && p2->expon != 0) {
        /* 还有多项式非零项，并且当前项指数不为零 */
        p2->coef *= p2->expon; /* 求当前项导数的系数 */
        p2->expon--; /* 求当前项导数的指数 */
        p1 = p2;
        p2 = p2->next; /* p1和p2后移 */
    }
    if (p2 != NULL) { /* 处理最后的常数项 */
        if (p1 != NULL) { /* 如果常数项不是唯一项（前一项非0）*/
            free(p2); /* 求导后为0项略去 */
            p1->next = NULL;
        } else /* 多项式只有常数项 */
            p2->coef = 0; /* 存为零多项式 */
    }
    return p;
}

int main(void) {
    Polynomial p;

    p = ReadPoly();
    p = PolyDifferentiation(p);
    PrintPoly(p);

    return 0;
}

Position Attach(CoefSet coef, int expon, Position rear) {
    rear->next = (Position)malloc(sizeof(struct
                                         PolyNode)); /* 在rear后面新建一个结点 */
    rear->next->coef = coef;
    rear->next->expon = expon;
    rear->next->next = NULL;
    rear = rear->next; /* rear指向新的最后一个结点 */
    return rear;
}

Polynomial ReadPoly() {
    int i, n;
    CoefSet coef;
    int expon;
    Position rear, temp;
    Polynomial p;

    p = (Polynomial)malloc(sizeof(struct PolyNode)); /* 创建临时空头结点 */
    rear = p; /* rear指向多项式最后一个结点，初始化指向空头结点 */
    rear->next = NULL;
    while (scanf("%d %d", &coef,
                 &expon) != EOF) { /* 读入当前项系数和指数，直到文件结尾 */
        rear = Attach(coef, expon, rear); /* 新增非零项贴到多项式尾部 */
    }
    temp = p;
    p = p->next; /* 令p指向结果多项式第一个非零项 */
    free(temp); /* 清除临时空头结点 */
    return p;
}

void PrintPoly(Polynomial p) {
    /* 输出多项式 */
    int flag = 0; /* 辅助调整输出格式用 */

    while (p != NULL) {
        if (!flag)
            flag = 1;
        else
            printf(" ");
        printf("%d %d", p->coef, p->expon);
        p = p->next;
    }
    printf("\n");
}